From dff2aa20ff33d84a5b7320a9506ad19165251f7d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 9 Feb 2021 20:28:42 -0500 Subject: [PATCH] gl: Fixed clipped offscreen rendering When we are rendering a texture node to an offscreen, and we have a clip, we must force the offscreen rendering. Otherwise, the code will notice: Hey, it already is a texture node, so no need to render it to a texture again. But when clipping is involved, that is exactly what we want to do. Testcase included. Fixes: #3651 --- gsk/gl/gskglrenderer.c | 11 +- .../gsk/compare/rounded-clip-in-clip-3d.node | 109 ++++++++++++++++++ .../gsk/compare/rounded-clip-in-clip-3d.png | Bin 0 -> 1218 bytes testsuite/gsk/meson.build | 1 + 4 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 testsuite/gsk/compare/rounded-clip-in-clip-3d.node create mode 100644 testsuite/gsk/compare/rounded-clip-in-clip-3d.png diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c index 5a15bf5911..a68b45e663 100644 --- a/gsk/gl/gskglrenderer.c +++ b/gsk/gl/gskglrenderer.c @@ -1741,7 +1741,6 @@ render_rounded_clip_node (GskGLRenderer *self, return; } - /* TODO: Intersect current and new clip */ ops_push_clip (builder, &transformed_clip); gsk_gl_renderer_add_render_ops (self, child, builder); ops_pop_clip (builder); @@ -1750,19 +1749,13 @@ render_rounded_clip_node (GskGLRenderer *self, { gboolean is_offscreen; TextureRegion region; - /* NOTE: We are *not* transforming the clip by the current modelview here. - * We instead draw the untransformed clip to a texture and then transform - * that texture. - * - * We do, however, apply the scale factor to the child clip of course. - */ + ops_push_clip (builder, &transformed_clip); if (!add_offscreen_ops (self, builder, &node->bounds, child, ®ion, &is_offscreen, - 0)) + FORCE_OFFSCREEN)) g_assert_not_reached (); - ops_pop_clip (builder); ops_set_program (builder, &self->programs->blit_program); diff --git a/testsuite/gsk/compare/rounded-clip-in-clip-3d.node b/testsuite/gsk/compare/rounded-clip-in-clip-3d.node new file mode 100644 index 0000000000..f2023fef7a --- /dev/null +++ b/testsuite/gsk/compare/rounded-clip-in-clip-3d.node @@ -0,0 +1,109 @@ + clip { + child: transform { + child: transform { + child: container { + transform { + child: container { + transform { + child: container { + rounded-clip { + child: texture { + bounds: 0 0 198 198; +texture: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoCAIAAADCwUOzAAAQ3ElEQVR42u3WMQEAAAQAQeTQ\ +vyYVjIa7CD99TnQAAAC/lQQAAGDcAQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAAMC4AwCA\ +cQcAAIw7AAAYdwAAwLgDAADGHQAAjDsAAGDcAQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcA\ +ADDuAACAcQcAAIw7AAAYdwAAwLgDAADGHQAAjDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwBAADj\ +DgAAGHcAADDuAACAcQcAAIw7AAAYdwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAAAw7gAA\ +YNwBAADjDgAAxh0AADDuAACAcQcAAOMOAAAYdwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYd\ +AACMOwAAYNwBAADjDgAAxh0AADDuAACAcQcAAOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3AADA\ +uAMAAMYdAACMOwAAYNwBAADjDgAAxh0AADDuAABg3AEAAOMOAAAYdwAAMO4AAIBxBwAAjDsA\ +ABh3AADAuAMAgHEHAACMOwAAYNwBAMC4AwAAxh0AADDuAABg3AEAAOMOAAAYdwAAMO4AAIBx\ +BwAA4w4AABh3AADAuAMAgHEHAACMOwAAYNwBAMC4AwAAxh0AAIw7AABg3AEAAOMOAADGHQAA\ +MO4AAIBxBwAA4w4AABh3AADAuAMAgHEHAACMOwAAGHcAAMC4AwAAxh0AAIw7AABg3AEAAOMO\ +AADGHQAAMO4AAGDcAQAA4w4AABh3AAAw7gAAgHEHAACMOwAAGHcAAMC4AwAAxh0AAIw7AABg\ +3AEAwLgDAADGHQAAMO4AAGDcAQAA4w4AABh3AAAw7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcA\ +AIw7AABg3AEAwLgDAADGHQAAMO4AAGDcAQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAAMC4\ +AwCAcQcAAIw7AAAYdwAAwLgDAADGHQAAjDsAAGDcAQAA4w4AAMYdAAAw7gAAgHEHAADjDgAA\ +GHcAADDuAACAcQcAAIw7AAAYdwAAwLgDAADGHQAAjDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwB\ +AADjDgAAGHcAADDuAACAcQcAAIw7AAAYdwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAAAw\ +7gAAYNwBAADjDgAAxh0AADDuAACAcQcAAOMOAAAYdwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMA\ +AMYdAACMOwAAYNwBAADjDgAAxh0AADDuAACAcQcAAOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3\ +AADAuAMAAMYdAACMOwAAYNwBAADjDgAAxh0AADDuAABg3AEAAOMOAAAYdwAAMO4AAIBxBwAA\ +jDsAABh3AADAuAMAgHEHAACMOwAAYNwBAMC4AwAAxh0AADDuAABg3AEAAOMOAAAYdwAAMO4A\ +AIBxBwAA4w4AABh3AADAuAMAgHEHAACMOwAAYNwBAMC4AwAAxh0AAIy7BAAAYNwBAADjDgAA\ +xh0AADDuAACAcQcAAOMOAAAYdwAAwLgDAIBxBwAAjDsAABh3AADAuAMAAMYdAACMOwAAYNwB\ +AADjDgAAxh0AADDuAACAcQcAAOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3AADAuAMAAMYdAACM\ +OwAAYNwBAMC4AwAAxh0AADDuAABg3AEAAOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3AADAuAMA\ +gHEHAACMOwAAYNwBAMC4AwAAxh0AADDuAABg3AEAAOMOAADGHQAAMO4AAIBxBwAA4w4AABh3\ +AADAuAMAgHEHAACMOwAAYNwBAMC4AwAAxh0AAIw7AABg3AEAAOMOAADGHQAAMO4AAIBxBwAA\ +4w4AABh3AAAw7gAAgHEHAACMOwAAGHcAAMC4AwAAxh0AAIw7AABg3AEAAOMOAADGHQAAMO4A\ +AGDcAQAA4w4AABh3AAAw7gAAgHEHAACMOwAAGHcAAMC4AwCAcQcAAIw7AABg3AEAwLgDAADG\ +HQAAMO4AAGDcAQAA4w4AABh3AAAw7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcAAIw7AABg3AEA\ +wLgDAADGHQAAjDsAAGDcAQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcAAIw7\ +AAAYdwAAwLgDAADGHQAAjDsAAGDcAQAA4w4AAMYdAAAw7gAAYNwBAADjDgAAGHcAADDuAACA\ +cQcAAIw7AAAYdwAAwLgDAADGHQAAjDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwBAADjDgAAGHcA\ +ADDuAACAcQcAAOMOAAAYdwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwBAADj\ +DgAAxh0AADDuAACAcQcAAOMOAAAYdwAAwLgDAIBxBwAAjDsAABh3AADAuAMAAMYdAACMOwAA\ +YNwBAADjDgAAxh0AADDuAACAcQcAAOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3AADAuAMAAMYd\ +AACMOwAAYNwBAMC4AwAAxh0AADDuAABg3AEAAOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3AADA\ +uAMAgHEHAACMOwAAYNwBAMC4AwAAxh0AADDuAABg3AEAAOMOAADGHQAAMO4AAIBxBwAA4w4A\ +ABh3AADAuAMAgHEHAACMOwAAYNwBAMC4AwAAxh0AAIw7AABg3AEAAOMOAADGHQAAMO4AAIBx\ +BwAA4w4AABh3AAAw7gAAgHEHAACMOwAAGHcAAMC4AwAAxh0AAIw7AABg3AEAAOMOAADGHQAA\ +MO4AAGDcAQAA4w4AABh3AAAw7gAAgHEHAACMOwAAGHcAAMC4AwCAcQcAAIw7AABg3AEAwLgD\ +AADGHQAAMO4AAGDcAQAA4w4AABh3AAAw7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcAAIw7AABg\ +3AEAwLgDAADGHQAAjLsEAABg3AEAAOMOAADGHQAAMO4AAIBxBwAA4w4AABh3AADAuAMAgHEH\ +AACMOwAAGHcAAMC4AwAAxh0AAIw7AABg3AEAAOMOAADGHQAAMO4AAIBxBwAA4w4AABh3AAAw\ +7gAAgHEHAACMOwAAGHcAAMC4AwAAxh0AAIw7AABg3AEAwLgDAADGHQAAMO4AAGDcAQAA4w4A\ +ABh3AAAw7gAAgHEHAACMOwAAGHcAAMC4AwCAcQcAAIw7AABg3AEAwLgDAADGHQAAMO4AAGDc\ +AQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcAAIw7AABg3AEAwLgDAADGHQAA\ +jDsAAGDcAQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAADDuAACAcQcAAIw7AAAYdwAAwLgD\ +AADGHQAAjDsAAGDcAQAA4w4AAMYdAAAw7gAAYNwBAADjDgAAGHcAADDuAACAcQcAAIw7AAAY\ +dwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwBAADjDgAAGHcAADDuAACAcQcA\ +AOMOAAAYdwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAACMOwAAYNwBAADjDgAAxh0AADDu\ +AACAcQcAAOMOAAAYdwAAwLgDAIBxBwAAjDsAABh3AADAuAMAAMYdAACMOwAAYNwBAADjDgAA\ +xh0AADDuAABg3AEAAOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3AADAuAMAAMYdAACMOwAAYNwB\ +AMC4AwAAxh0AADDuAABg3AEAAOMOAAAYdwAAMO4AAIBxBwAA4w4AABh3AADAuAMAgHEHAACM\ +OwAAYNwBAMC4AwAAxh0AADDuAABg3AEAAOMOAADGHQAAMO4AAIBxBwAA4w4AABh3AADAuAMA\ +gHEHAACMOwAAGHcAAMC4AwAAxh0AAIw7AABg3AEAAOMOAADGHQAAMO4AAIBxBwAA4w4AABh3\ +AAAw7gAAgHEHAACMOwAAGHcAAMC4AwAAxh0AAIw7AABg3AEAwLgDAADGHQAAMO4AAGDcAQAA\ +4w4AABh3AAAw7gAAgHEHAACMOwAAGHcAAMC4AwCAcQcAAIw7AABg3AEAwLgDAADGHQAAMO4A\ +AGDcAQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcAAIw7AABg3AEAwLgDAADG\ +HQAAjDsAAGDcAQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAADDuAACAcQcAAIw7AAAYdwAA\ +wLgDAADGHQAAjDsAAGDcAQAA4w4AAMYdAAAw7gAAYNwBAADjDgAAGHcAADDuAACAcQcAAIw7\ +AAAYdwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwBAADjDgAAGHcAADDuAACA\ +cQcAAOMOAAAYdwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAACMuwQAAGDcAQAA4w4AAMYd\ +AAAw7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcAAIw7AAAYdwAAwLgDAADGHQAAjDsAAGDcAQAA\ +4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAADDuAACAcQcAAIw7AAAYdwAAwLgDAADGHQAAjDsA\ +AGDcAQDAuAMAAMYdAAAw7gAAYNwBAADjDgAAGHcAADDuAACAcQcAAIw7AAAYdwAAwLgDAIBx\ +BwAAjDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwBAADjDgAAxh0AADDuAACAcQcAAOMOAAAYdwAA\ +wLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAACMOwAAYNwBAADjDgAAxh0AADDuAACAcQcAAOMO\ +AAAYdwAAMO4AAIBxBwAAjDsAABh3AADAuAMAAMYdAACMOwAAYNwBAADjDgAAxh0AADDuAABg\ +3AEAAOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3AADAuAMAgHEHAACMOwAAYNwBAMC4AwAAxh0A\ +ADDuAABg3AEAAOMOAAAYdwAAMO4AAIBxBwAA4w4AABh3AADAuAMAgHEHAACMOwAAYNwBAMC4\ +AwAAxh0AAIw7AABg3AEAAOMOAADGHQAAMO4AAIBxBwAA4w4AABh3AADAuAMAgHEHAACMOwAA\ +GHcAAMC4AwAAxh0AAIw7AABg3AEAAOMOAADGHQAAMO4AAGDcAQAA4w4AABh3AAAw7gAAgHEH\ +AACMOwAAGHcAAMC4AwAAxh0AAIw7AABg3AEAwLgDAADGHQAAMO4AAGDcAQAA4w4AABh3AAAw\ +7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcAAIw7AABg3AEAwLgDAADGHQAAMO4AAGDcAQAA4w4A\ +AMYdAAAw7gAAgHEHAADjDgAAGHcAAMC4AwCAcQcAAIw7AAAYdwAAwLgDAADGHQAAjDsAAGDc\ +AQAA4w4AAMYdAAAw7gAAgHEHAADjDgAAGHcAADDuAACAcQcAAIw7AAAYdwAAwLgDAADGHQAA\ +jDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwBAADjDgAAGHcAADDuAACAcQcAAIw7AAAYdwAAwLgD\ +AIBxBwAAjDsAAGDcAQDAuAMAAMYdAAAw7gAAYNwBAADjDgAAxh0AADDuAACAcQcAAOMOAAAY\ +dwAAwLgDAIBxBwAAjDsAAGDcAQDAuAMAAMYdAACMOwAAYNwBAADjDgAAxh0AADDuAACAcQcA\ +AOMOAAAYdwAAMO4AAIBxBwAAjDsAABh3AADAuAMAADcL5yQI6xyudn0AAAAASUVORK5CYII=\ +"); + } + clip: 0 0 198 198 / 99; + } + } + transform: translate(1, 1); + } + } + transform: translate(1007, 756); + } + } + transform: translate(15, 15); + } + transform: translate(0, 50); + } + clip: 0 0 1253 873; + } diff --git a/testsuite/gsk/compare/rounded-clip-in-clip-3d.png b/testsuite/gsk/compare/rounded-clip-in-clip-3d.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6791915689449ec3015db050738bb1c86b4c17 GIT binary patch literal 1218 zcmV;z1U>tSP)~p);{;F&-=Z54YPmjz0clfU%};0>0buPAm~b90Ax9EC$J1y3fuwQ1}p(?1r`H~ z!pG-;>%gDDEbs^L8!!W01FnKz0h%C}pfe@3ua)=L)q_|UP-RMEDd+>h8jyQ|yMfiD zoxe;oz$EZ1=+D4;kROEBOv!ch3=hTvD2@9;)`PAC9wZGx%qD^FLC%7n5n4Z57gQA< zj2lpvuYyI7f<6K~4AN&^Q+IS4_!i_FnEP6|a?!e?Sa~r1Ls_{NI-7w_z>sx41)Bg) zL2^>Kbk4e%n0PSwXNsg-KpqF~v98C+FQ8w7obV}Ejf0^K-VT2~4QvJ0S=SSpv%qn< zC*2R>mHo;IDTY;B=4c4_()M?-Y zp>^E4kTUdqFqFo2U_0?YTCIvn;IPm-Y+Xo^dNvr!iX9+3fC1}TdQ=nikZ}2sbsjdd+Gbsls?xcr56A$h2LFv5o1 zFzJSzvv&%Ty;a{ZtZXopwToeT6nN9R7B{cApl`Qu?z(j$SyVC@VcN7G7__d%-Ov>1 zt}0HiDiw@y%=-YybJn%Eh0u>d-l)@09gOhA=?J}l{JU-@AbC0FCs)x1LutGK9JQ{)73xKy^`UhU^GU1= zn2*wU8xKVt91Z{L=tMPQgxfWa0UNDrai#hSI?u#(+etLR2 zY2UD877S%zH^@P&_Fe4cVA@A)m;^&<>;oOKXxmkZj--91e5EhG!ymf0>~>wH4GXP( zWj0u9Fw&vXM+%pP>=BxyrL|U8L*a4)UsJd)=+3e(UnnIQ>Ekzl`sDH;+l1yvg|||4 z17Y)Syy$jZopc^6dK0kFV1#2Hr}51@m#o#+8QO_FzRS7p=$1S#b?Z79 z>9v{sgx?V8;?M@}>-IX(9Hvrw01t(WM}O#(UFmAX@F|pwS9epY%)to1PjLaiir>X) z3i|HK`uiMROr@qr@ld#U4Te6NNv09QH}YI{WZU@5IAU~$vwhCFvSsV53l2uQ;PxMa gbd|9w^w|aZ8}bk%a%Bbli2wiq07*qoM6N<$f_D=_LI3~& literal 0 HcmV?d00001 diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index dbe7b9710c..1c45056104 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -75,6 +75,7 @@ compare_render_tests = [ 'clip-in-rounded-clip1', 'clip-in-rounded-clip2', 'clip-in-rounded-clip3', + 'rounded-clip-in-clip-3d', # not really 3d, but cairo fails it 'issue-3615' ] -- 2.30.2